package com.Shuang.BS.TCP;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class Server {
    public static void main(String[] args) {
        try {
            System.out.println("====服务端启动====");
            //1 创建服务端并注册端口号
            ServerSocket serverSocket = new ServerSocket(8888);

            //4 创建一个线程池对象
            /*
            * ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

                     核心线程池数量（io密集型最好是电脑逻辑处理器数量乘2），最大线程池数量，临时线程空闲时间多少自动销毁，前面空闲的时间单位，
                     允许进来缓存的任务队列 创建的线程池工厂（让他来帮助创建线程），过多任务进来时的处理模式（忙不过来的拒绝策略）
            * */
            ThreadPoolExecutor pool = new ThreadPoolExecutor(12 * 2, 12 * 2, 0, TimeUnit.SECONDS,
                    new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy());//默认的线程工厂，默认策略过多处理不了直接拒绝然后抛个异常出来

            while (true) {
                //2 等待连接请求
                Socket socket = serverSocket.accept();

                //3 为了改善性能将 接受了请求的socket交给线程池处理，而不是接受一个创建一个线程，这样避免了太多线程占用系统资源
                pool.execute(new ServerRunnableThread(socket));  //要接一个任务类对象（Runnable）
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
